package main

import "fmt"

/**
15_观察者模式
概念：定义对象间的一种一对多的依赖关系，当一个对象的状态发生改变时，所有依赖于它的对象都得到通知并被自动更新。
观察者模式（Observer）又称发布-订阅模式（Publish-Subscribe：Pub/Sub）。
它是一种通知机制，让发送通知的一方（被观察方）和接收通知的一方（观察者）能彼此分离，互不影响。
*/

type Observer interface {
	Update(subject *ObSubject)
}

type ObSubject struct {
	observers []Observer
	msg       string
}

func NewObSubject() *ObSubject {
	return &ObSubject{observers: make([]Observer, 0), msg: ""}
}

// 添加观察者
func (o *ObSubject) Attach(item Observer) {
	o.observers = append(o.observers, item)
}

func (o *ObSubject) Notify() {
	for _, observer := range o.observers {
		observer.Update(o)
	}
}

func (o *ObSubject) UpdateMsg(context string) {
	o.msg = context
	o.Notify()
}

type Reader struct {
	name string
}

func NewReader(name string) *Reader {
	return &Reader{name: name}
}

func (r *Reader) Update(s *ObSubject) {
	fmt.Printf("【%s】收到的信息：%v\n", r.name, s.msg)
}
func main() {
	// 注册被观察者
	subject := NewObSubject()
	// 注册观察者
	reader1 := NewReader("r1")
	reader2 := NewReader("r2")
	reader3 := NewReader("r3")
	reader4 := NewReader("r4")
	subject.Attach(reader1)
	subject.Attach(reader2)
	subject.Attach(reader3)
	subject.Attach(reader4)
	subject.UpdateMsg("通知你们一下 我以后一定成功。")
}
